package com.liu.design.structure.decorate;

/**
 * @author LIU
 * @version 1.0
 * @date 2024/5/6 18:07
 * @description 装饰者模式(Decorator Pattern)
 * 它可以动态的将新功能附加到对象上，同时又不改变其结构
 *
 * 装饰者模式就像打包一个快递，不断的动态添加新的功能，可以组合出所有情况：
 *
 * Drink 类就是前面说的抽象类
 * Decorator 是一个装饰类，含有一个被装饰的对象(Drink obj)和的cost()方法进行一个费用的叠加计算，递归的计算价格
 * Milk和Sugar是具体的装饰者
 * Coffee是被装饰者主体
 * LongBlack和Espresso是具体实现的被装饰者实体
 *
 */
public class Test {
    public static void main(String[] args) {
        Drink order = new LongBlack();

        System.out.println("费用 = " + order.cost() + ", 描述 = " + order.getDes());
        // 2.1 order 加一份牛奶
        order = new Milk(order);
        System.out.println("费用 = " + order.cost() + ", 描述 = " + order.getDes());
        // 2.2 order 再加一份牛奶
        order = new Milk(order);
        System.out.println("费用 = " + order.cost() + ", 描述 = " + order.getDes());
        // 3. order 加一份糖
        order = new Sugar(order);
        System.out.println("费用 = " + order.cost() + ", 描述 = " + order.getDes());
    }
}
